<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>适配器模式</title>
</head>
<body>

<script>
    /**
     * 接口不兼容时可创建适配器将其包装成一个能继续正常工作的接口
     * 适配器模式是个“亡羊补牢”的模式，没人会在程序设计之初就使用它
     * 如果现有接口能正常工作，则永远都不会用上适配器模式
     *
     * 装饰者模式、代理模式和外观模式都属于“包装模式”，与适配器模式相似，区别在于模式的意图：
     * 1.适配器模式主要用来解决两个已有接口间不匹配的问题，不会修改旧接口也不需要考虑旧接口的实现细节
     * 2.装饰者模式是为了给对象增加功能，常形成一条长的装饰链，而适配器模式只包装一次
     *   代理模式是为了控制对对象的访问，通常也只包装一次
     * 3.外观模式最显着的特点是定义了一个新接口
     *
     * 当两个数据结构不一致时也能通过增加一个数据格式转换的适配器来解决问题
     * */
    const googleMap = {
        show() {
        }
    }
    const baiduMap = {
        display() {

        }
    }

    function renderMap(map) {
        if (map.show instanceof Function) {
            map.show()
        }
    }

    // 为百度地图添加适配器
    const baiduMapAdapter = {
        show() {
            return baiduMap.display()
        }
    }

    renderMap(googleMap)
    renderMap(baiduMapAdapter)
</script>
</body>
</html>